#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
using ll=long long;

vector<int> cnt(5);
vector<vector<int>> same(13,vector<int>(13));
unordered_set<string> has;
vector<int> path;
int ret;
bool isSame(int pos,int cur)
{
	for(int i=1;i<pos;i++)
	{
		if(same[pos][i] && path[i]!=cur)
			return false;
	}
	return true;
}
void dfs(int pos)
{
	if(pos>12)
	{
		ret++;
		return;
	}
	for(int i=1;i<=4;i++)
	{
		if(cnt[i]==0)
			continue;
		if(!isSame(pos,i))
			continue;
		
		cnt[i]--;
		path.push_back(i);
		dfs(pos+1);
		path.pop_back();
		cnt[i]++;
	}
}
int main()
{
	int m;
	for(int i=1;i<=4;i++)
		cin>>cnt[i];
	cin>>m;
	for(int i=0;i<m;i++)
	{
		int x,y;
		cin>>x>>y;
		same[x][y]=same[y][x]=1;
	}
	
	path.push_back(0);
	dfs(1);
	return 0;
}
